package com.itheima.controller;

import com.itheima.domain.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;
import java.util.List;

@Controller
public class UserController {

    //普通参数
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name) {

        System.out.println("普通参数传递 ==>：" + name);
        return "{'module':'common param'}" + name;
    }

    //普通参数：请求参数名与形参名不同  -->@RequestParam("请求参数名")
    @RequestMapping("/commonParamDifferenceName")
    @ResponseBody
    public String commonParamDifferenceName(@RequestParam("name") String userName) {
        System.out.println("接收到参数：" + userName);

        return "{'module':'commonParamDifferenceName'}";
    }

    //实体类参数接收       -->请求参数名和形参名一致就能传进去
    @RequestMapping("/pojoParam")
    @ResponseBody
    public String pojoParam(User user) {
        System.out.println("实体参数：" + user);
        System.out.println(user.getName());
        return "{'module':'pojoParam'}";
    }

    //复杂实体类型
    //在传参的时候是  属性名.下一层属性名
    @RequestMapping("/pojocontainpojoParam")
    @ResponseBody
    public String pojocontainpojoParam(User user) {
        System.out.println("复杂实体类型：" + user.toString());

        return "{'module':'pojocontainpojoParam'}";
    }

    //数组传参
    //服务器端的形参写成数组就行，请求时同一个参数名多写几次就是发送数组
    @RequestMapping("/arrayParam")
    @ResponseBody
    public String arrayParam(String [] like) {
        System.out.println("数组参数：" + like.toString());

        return "{'module':'arrayParam'}";
    }

    //集合参数

    /**
     * java.lang.NoSuchMethodException: java.util.List.<init>()     -->方法报错中，如果有<init>，说明是构造方法报错
     * 集合会被SpringMvc误以为是一个引用类型对象，所以他尝试先用构造方法new一个对象出来，然后再调用set方法，然而我们这里面只想把参数简单的传进去
     * 形参前添加@RequestParam注解
     *
     * 并且集合传参的时候参数名与集合名保持一致
     * @param like
     * @return
     */
    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(@RequestParam List<String> like) {
        System.out.println("集合参数：" + like);

        return "{'module':'listParam'}";
    }

    /**
     * 传json数据：json数组。json对象，json对象数组
     * json不仅能发对象类型的参数，还能发集合类型的参数
     *
     * 1.需要一个将json转成参数的jar包：jackson-databind
     * 2.SpringMvc不知道要对外面发送过来的Json格式数据做转化，要开启一个开关-->在SpringMvc的配置中添加注解@EnableWebMvc
     * 3.本来要加一个@RequestParam，但现在没有数据（Json格式），用@RequestBody
     */

    //集合参数：json格式       发送请求时用中括号，不用花括号
    @RequestMapping("/listParamForJson")
    @ResponseBody
    public String listParamForJson(@RequestBody List<String> likes) {
        System.out.println("普通集合参数，json格式：" + likes);

        return "{'module':'listParamForJson'}";
    }

    //POJO参数：json格式
    @RequestMapping("/pojoParamForJson")
    @ResponseBody
    public String pojoParamForJson(@RequestBody User user) {
        System.out.println("pojo参数,json格式：" + user);

        return "{'module':'pojoParamForJson'}";
    }

    //集合参数：json格式

    /**
     * 请求格式
     * [
     *     {"name":"aaa","age":12,"address":{"province":"as","city":"asd"}},
     *     {"name":"bbb","age":34,"address":{"province":"as","city":"asd"}}
     * ]
     * @param list
     * @return
     */
    @RequestMapping("/listpojoParamJson")
    @ResponseBody
    public String listpojoParamJson(@RequestBody List<User> list) {
        System.out.println("pojo集合参数，Json格式：" + list);

        return "{'module':'listpojoParamForJson'}";
    }

    /**
     * @RequestParam用于接收url传参，表单传参
     * @RequestBody用于接收json格式数据
     */

    //日期格式      -->用注解指定传参形式    参数不用加引号
    @RequestMapping("/dateParam")
    @ResponseBody
    public String dateParam(@DateTimeFormat(pattern = "yy-mm-dd") Date date1, @DateTimeFormat(pattern = "yy/mm/dd hh/mm/ss") Date date2) {
        System.out.println("日期格式参数：" + date1 + ' ' + date2);
        return "{'module':'dateParam'}";
    }
}
